<?php

namespace CMS\Service;

/**
 * 文档分类的逻辑处理
 */
class Category
{
    /**
     * 用到的便加入缓存,可能是不完整的分类数据,不能直接用来返回所有分类
     * @var array 分类列表
     */
    private static $list;
    
    private static $cacheKey = 'sys_category_list';

    /**
     * 获取分类信息并缓存分类
     * 
     * @param integer $id 分类ID
     * @return array 分类信息
     */
    public static function one($id)
    {
        /* 非法分类ID */
        if (empty($id) || !is_numeric($id)) {
            return [];
        }

        /* 读取缓存数据 */
        if (empty(static::$list)) {
            static::$list = S(static::$cacheKey);
        }

        /* 获取分类名称 */
        if (!isset(static::$list[$id])) {
            $cate = M('Category')->find($id);
            if (!$cate || 1 != $cate['status']) { // 不存在分类，或分类被禁用
                return [];
            }
            static::$list[$id] = $cate;
            S(static::$cacheKey, static::$list); // 更新缓存
        }
        
        return static::$list[$id];
    }
    
    /**
     * 返回一条分类信息的某个字段
     * @param int $id 分类ID
     * @param string $field 要获取的字段名
     * @return string 分类信息字段
     */
    public static function field($id, $field)
    {
        $one = static::one($id);
        
        return isset($one[$field]) ? $one[$field] : '';
    }
    
    /**
     * 获取指定分类的所有父级分类
     * @param int $id 分类id
     * @return array
     */
    public static function parents($id)
    {
        if (empty($id)) {
            return [];
        }
        
        $cates = M('Category')->where(['status' => 1])
            ->field('id,title,pid')
            ->order('sort')
            ->select();
        $child = static::one($id); // 获取参数分类的信息
        $pid = $child['pid'];
        
        $res[] = $child;
        while (true) {
            foreach ($cates as $cate) {
                if ($cate['id'] == $pid) {
                    $pid = $cate['pid'];
                    array_unshift($res, $cate); // 将父分类插入到数组第一个元素前
                }
            }
            if ($pid == 0) {
                break;
            }
        }
        
        return $res;
    }
    
    /**
     * 获取当前分类的文档类型
     * @param int $id
     * @return array 文档类型数组
     */
    public static function type($id)
    {
        if (empty($id)) {
            return [];
        }
        
        $types = C('DOCUMENT_MODEL_TYPE');
        $model_type = M('Category')->getFieldById($id, 'type');
        $model_type = explode(',', $model_type);
        foreach ($types as $key => $value) {
            if (!in_array($key, $model_type)) {
                unset($types[$key]);
            }
        }
        
        return $types;
    }

}
